#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <syslog.h>

#define MAXFD 64

extern int daemon_proc;

void daemon_init(const char *pname, int facility)
{
    int i;
    pid_t pid;

    if(pid = fork()) exit(0); // fork，终止父进程

    setsid(); // 第一子进程

    signal(SIGHUP, SIG_IGN); // 忽略SGIHUP信号并在此调用fork

    if(pid = fork()) exit(0); // fork，终止第一子进程

    daemon_proc = 1; // 第二子进程,非零时，出错处理函数将调用syslog函数取代fprintf输出到标准错误输出

    chdir("/"); // 将工作目录设置为"/"

    umask(0); // 清楚文件掩码

    for(i=0; i <MAXFD; i++) {
        close(i); // 关闭所有文件句柄
    }

    openlog(pname, LOG_PID, facility);
}